using System;
using System.Collections.Generic;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;
using NHibernate;

namespace Neturion.Repositorios
{
    
    public class RepositorioCbo : IRepositorioCbo
    {
        public Cbo Inserir(Cbo cbo)
        {
            cbo.FimVigencia = cbo.FimVigencia.HasValue ? cbo.FimVigencia.Value.Date : cbo.FimVigencia;
            cbo.InicioVigencia = cbo.InicioVigencia.HasValue ? cbo.InicioVigencia.Value.Date : cbo.FimVigencia;
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(cbo);
            return cbo;
        }

        public Cbo Atualizar(Cbo cbo)
        {
            Cbo tmpCbo = ObterPorId(cbo.CboId);

            tmpCbo.Codigo = cbo.Codigo;
            tmpCbo.Descricao = cbo.Descricao;
            tmpCbo.CboAnterior = cbo.CboAnterior;
            tmpCbo.EnumTipoCbo = cbo.EnumTipoCbo;
            tmpCbo.FimVigencia = cbo.FimVigencia.HasValue ? cbo.FimVigencia.Value.Date : cbo.FimVigencia;
            tmpCbo.InicioVigencia = cbo.InicioVigencia.HasValue ? cbo.InicioVigencia.Value.Date : cbo.FimVigencia;
            tmpCbo.NeturionLog = cbo.NeturionLog;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpCbo);
            return tmpCbo;
        }

        public void Excluir(Cbo cbo)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(cbo);
        }

        public IList<Cbo> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cbo));
            return criteria.List<Cbo>() as List<Cbo>;
        }

        public IList<Cbo> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string codigo, EnumTipoCbo enumTipoCbo, string descricao, Cbo cboAnterior, DateTime? inicioVigenciaDe, DateTime? inicioVigenciaAte, DateTime? fimVigenciaDe,
          DateTime? fimVigenciaAte)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            IList<Cbo> list;
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cbo))
               .SetFirstResult(inicio).SetMaxResults(quantidade);

            if (!string.IsNullOrEmpty(codigo))
            {
                criteria.Add(Restrictions.Eq("Codigo", codigo));
            }

            if (enumTipoCbo > 0)
            {
                criteria.Add(Restrictions.Eq("EnumTipoCbo", enumTipoCbo));
            }

            if (!string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }
            
            if (cboAnterior !=null)
            {
                criteria.Add(Restrictions.Eq("CboAnterior",cboAnterior));
            }

            if (inicioVigenciaDe.HasValue)
            {
                criteria.Add(inicioVigenciaAte.HasValue
                    ? Restrictions.Between("InicioVigencia", inicioVigenciaDe.Value.Date, inicioVigenciaAte.Value.Date)
                    : Restrictions.Eq("InicioVigencia", inicioVigenciaDe.Value.Date));
            }

            if (fimVigenciaDe.HasValue)
            {
                criteria.Add(fimVigenciaAte.HasValue
                    ? Restrictions.Between("FimVigencia", fimVigenciaDe.Value.Date, fimVigenciaAte.Value.Date)
                    : Restrictions.Eq("FimVigencia", fimVigenciaDe.Value.Date));
            }

            list = criteria.List<Cbo>() as List<Cbo>;


            //list = (from cnae in GerenciadorBDConfigs.Instance.SessaoAtual().Query<Cnae>()
            //        select cnae).Skip(inicio).Take(quantidade).ToList();

            return list;
        }

        public Cbo ObterPorId(int id)
        {
           return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Cbo>(id);
        }

        public IList<Cbo> ObterPorCodigo(string codigo)
        {
            ICriteria criteria =
               GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cbo))
               .Add(Restrictions.Eq("Codigo", codigo));
            return criteria.List<Cbo>() as List<Cbo>;
        }

        public IList<Cbo> ObterPorDescricao(int inicio, int quantidade, int quantidadeMinima, string descricao)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }
           
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cbo))
               .SetFirstResult(inicio).SetMaxResults(quantidade);
            criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            return criteria.List<Cbo>() as List<Cbo>;
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cargo)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("CboId"));


            Cbo cbo = criteria.UniqueResult<Cbo>();
            int ultimoCodigo = cbo != null ? cbo.CboId : 0;

            return ultimoCodigo;
        }
    }
}